home *** CD-ROM | disk | FTP | other *** search
/ Sounds Terrific 2 / Sounds Terrific II (1996)(Weird Science)(Disc 1 of 2)[Amiga-PC].iso / archives / amiga / amichord.lha / AmiChord / src / transpose.c < prev   
C/C++ Source or Header  |  1995-04-09  |  2KB  |  89 lines

  1. #include "chord.h"
  2.  
  3. extern int grid_size;
  4. extern int transpose;
  5.  
  6. extern char *notes[];
  7. extern char mesg[];
  8.  
  9. int do_transpose (char *chord) {
  10.  
  11.     int i, j;
  12.     int p_chord, p_new_chord;
  13.     int sharp, flat, new_i;
  14.     unsigned char new_chord[MAXTOKEN];
  15.  
  16.     p_chord = 0;
  17.     p_new_chord = 0;
  18.  
  19.     while (TRUE) {
  20.         /* Find basic note */
  21.         i = 0;
  22.         while ((i < 7) && (strncmp (chord + p_chord, notes[i], strlen (notes[i]))))
  23.             i++;
  24.  
  25.         if (i >= 7)
  26.             return (1);
  27.  
  28.         /* Look for sharp or flat */
  29.         p_chord += strlen (notes[i]);
  30.         flat = (chord[p_chord] == 'b');
  31.         sharp = (chord[p_chord] == '#');
  32.         if (sharp || flat)
  33.             p_chord++;
  34.  
  35.         /*compute new chord name */
  36.  
  37.         new_i = i;
  38.  
  39.         /* moving upscale ... */
  40.         if (transpose > 0)
  41.             for (j = 0; j < transpose; j++)
  42.                 if (sharp) {
  43.                     sharp = 0;
  44.                     new_i = (new_i + 1) % 7;
  45.                 }
  46.                 else if (flat)
  47.                     flat = 0;
  48.                 else if ((new_i == 2) || (new_i == 6))
  49.                     new_i = (new_i + 1) % 7;
  50.                 else
  51.                     sharp++;
  52.  
  53.         /* moving downscale ... */
  54.         else
  55.             for (j = 0; j > transpose; j--)
  56.                 if (flat) {
  57.                     flat = 0;
  58.                     new_i = (new_i + 6) % 7;
  59.                 }
  60.                 else if (sharp)
  61.                     sharp = 0;
  62.                 else if ((new_i == 3) || (new_i == 0))
  63.                     new_i = (new_i + 6) % 7;
  64.                 else
  65.                     flat++;
  66.  
  67.         sprintf (new_chord + p_new_chord, "%s", notes[new_i]);
  68.         p_new_chord += strlen (notes[new_i]);
  69.  
  70.         if (sharp)
  71.             sprintf (new_chord + p_new_chord++, "#");
  72.         if (flat)
  73.             sprintf (new_chord + p_new_chord++, "b");
  74.  
  75.         while ((chord[p_chord] != '/') && (chord[p_chord] != '\0'))
  76.             new_chord[p_new_chord++] = chord[p_chord++];
  77.  
  78.         if (chord[p_chord] == '\0') {
  79.             new_chord[p_new_chord] = '\0';
  80.             sprintf (mesg, "[%s] becomes [%s]", chord, new_chord);
  81.             debug (mesg);
  82.             strcpy (chord, new_chord);
  83.             return (0);
  84.         } p_chord++;
  85.         new_chord[p_new_chord++] = '/';
  86.     }
  87. }
  88.  
  89.